package com.zp.self.module.level_4_算法练习.算法.二分查找;

/**
 * @author By ZengPeng
 */
public class 力扣_374_猜数字大小 {
    private static int pick = 2;

    //测试
    public static void main(String[] args) {

        System.out.println(new 力扣_374_猜数字大小().guessNumber(10));
        System.out.println(new 力扣_374_猜数字大小().guessNumber(1));
        System.out.println(new 力扣_374_猜数字大小().guessNumber(2));
        System.out.println(new 力扣_374_猜数字大小().guessNumber(2));
    }

    /**
     * 题目：猜数字游戏的规则如下：
     *
     * 每轮游戏，我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。
     * 如果你猜错了，我会告诉你，你猜测的数字比我选出的数字是大了还是小了。
     * 你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果，返回值一共有 3 种可能的情况（-1，1 或 0）：
     *
     * -1：我选出的数字比你猜的数字小 pick < num
     * 1：我选出的数字比你猜的数字大 pick > num
     * 0：我选出的数字和你猜的数字一样。恭喜！你猜对了！pick == num
     * 返回我选出的数字。
     *
     * 示例 1：
     * 输入：n = 10, pick = 6
     * 输出：6
     *
     * 示例 2：
     * 输入：n = 1, pick = 1
     * 输出：1
     *
     *
     * 分析：
     *      1.直接二分法啊  ，明显是最优解啊
     *
     * 边界值 & 注意点：
     *      1.
     **/
    public int guessNumber(int n) {
        int left =1 ,right =n;
        while (left<=right){
            int mid = left+((right-left)>>1);
            int guess = guess(mid);
            if(guess ==1){
                left=mid+1;
            }else if(guess ==-1){//-1：我选出的数字比你猜的数字小 pick < num
                right=mid-1;
            }else  return  mid;
        }
        return -1;
    }

    int guess(int num){
        if(num>pick) return -1;
        else if(num<pick) return 1;
        else return 0;
    }
}
